﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область СлужебныйПрограммныйИнтерфейс

Процедура ВыполнитьОбменДаннымиПоСценарию(КодСценарияОбмена) Экспорт
	
	Если Не ЗначениеЗаполнено(КодСценарияОбмена) Тогда		
		ВызватьИсключение НСтр("ru = 'Не задан сценарий обмена данными.'");		
	КонецЕсли;
	
	ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.СинхронизацияДанных);
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Код", КодСценарияОбмена);
	
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	СценарииОбменовДанными.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.СценарииОбменовДанными КАК СценарииОбменовДанными
		|ГДЕ
		|	СценарииОбменовДанными.Код = &Код
		|	И НЕ СценарииОбменовДанными.ПометкаУдаления";
	
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		
		Сценарий = Выборка.Ссылка;
		
	Иначе	
		
		СтрокаСообщения = НСтр("ru = 'Сценарий обмена данными с кодом %1 не найден.'");
		СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, КодСценарияОбмена);
		ВызватьИсключение СтрокаСообщения;
		
	КонецЕсли;
		
	УдалитьУстаревшиеЗадачи(Сценарий);
	
	Если ОтключитьСценарийПриНеобходимости(Сценарий) Тогда
		Возврат;
	КонецЕсли;
	
	// Должны быть выполнены задачи из сценария из последнего запуска
	Если Не ОчередьЗадачВыполнена(Сценарий) Тогда
		Возврат;
	КонецЕсли;
			
	ПерваяЗадача = Неопределено;
	ЗаполнитьЗадачиПоСценарию(Сценарий, ПерваяЗадача);
	
	ВыполнитьОчередьЗадач(ПерваяЗадача);
		
КонецПроцедуры

Процедура ВыполнитьОбменДаннымиВручную(Узел, ПараметрыОбмена, ДополнениеВыгрузки = Неопределено) Экспорт
	
	УдалитьУстаревшиеЗадачи(, Истина);
	
	ИдентификаторОбмена = Строка(Новый УникальныйИдентификатор);
	
	ПараметрыОбмена = Новый Структура;
	ПараметрыОбмена.Вставить("Узел", Узел);
	ПараметрыОбмена.Вставить("ИдентификаторОбмена", ИдентификаторОбмена);
	ПараметрыОбмена.Вставить("Отказ", Ложь);
	ПараметрыОбмена.Вставить("СообщениеОбОшибке", "");
	
	ПерваяЗадача = Неопределено;
	ЗаполнитьЗадачиДляОбменаВручную(Узел, ИдентификаторОбмена, ПерваяЗадача, ДополнениеВыгрузки);

	ПараметрыПроцедуры = Новый Массив;
	ПараметрыПроцедуры.Добавить(ПерваяЗадача);
	
	Ключ = ПерваяЗадача.ИдентификаторЗадачи;

	ПараметрыЗадания = Новый Структура;
	ПараметрыЗадания.Вставить("Ключ", Лев(Ключ, 120));	
	ПараметрыЗадания.Вставить("ИмяМетода"    , "ОбменДаннымиВнутренняяПубликация.ВыполнитьОчередьЗадач");
	ПараметрыЗадания.Вставить("ОбластьДанных", ПараметрыСеанса.ОбластьДанныхЗначение);
	ПараметрыЗадания.Вставить("Использование", Истина);
	ПараметрыЗадания.Вставить("ЗапланированныйМоментЗапуска", ТекущаяУниверсальнаяДата());
	ПараметрыЗадания.Вставить("Параметры", ПараметрыПроцедуры);
	ПараметрыЗадания.Вставить("КоличествоПовторовПриАварийномЗавершении", 3);
	ПараметрыЗадания.Вставить("ИнтервалПовтораПриАварийномЗавершении", 300);

	МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий");
	МодульОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания);
	
КонецПроцедуры	

Процедура ВыполнитьОчередьЗадач(Задача, ЗадачаПред = "") Экспорт
	
	Если ТипЗнч(Задача) = Тип("Строка") Тогда
		ТекЗадача = ЗадачаПоИдентификатору(Задача);
	Иначе
		ТекЗадача = Задача;
	КонецЕсли;
		
	Отказ = Ложь;
	Если ТекЗадача.НомерЗадачи = 1 Тогда
		
		СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы(ТекЗадача.УзелИнформационнойБазы, ТекЗадача.Действие, Отказ);
		
		Если Отказ Тогда
			Возврат;
		КонецЕсли;
		
		ОбменДаннымиСервер.ЗафиксироватьНачалоОбменаВРегистреСведений(СтруктураНастроекОбмена);
		
		СтрокаСообщения = НСтр("ru = 'Начало процесса обмена данными для узла %1'", ОбщегоНазначения.КодОсновногоЯзыка());
		СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтруктураНастроекОбмена.УзелИнформационнойБазыНаименование);
		ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(СтрокаСообщения, СтруктураНастроекОбмена);
	
	КонецЕсли;
	
	// Действия, которые выполняются в базе источнике. После их выполнения сразу можно выполнить следующую задачу
	ДействияВИсточнике = Новый Массив;
	ДействияВИсточнике.Добавить(Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанных);
	ДействияВИсточнике.Добавить(Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанных);
	ДействияВИсточнике.Добавить(Перечисления.ДействияПриОбменеВнутренняяПубликация.ДополнительнаяРегистрация);
	
	Отказ = Ложь;
	Пока Истина Цикл
		
		ПараметрыОбмена = ОбменДаннымиСервер.ПараметрыОбмена();
		ПараметрыОбмена.Вставить("ИдентификаторЗадачиПред", ЗадачаПред);
		
		ВыполнитьЗадачу(ТекЗадача, ПараметрыОбмена, Отказ);	
		
		Если Не Отказ И ДействияВИсточнике.Найти(ТекЗадача.Действие) <> Неопределено Тогда
			
			ЗадачаПред = ТекЗадача.ИдентификаторЗадачи;
			ТекЗадача = СледующаяЗадача(ТекЗадача.ИдентификаторЗадачи);
			
		Иначе
			
			Прервать;
			
		КонецЕсли;
		
		// Закончились задачи
		Если ТекЗадача = Неопределено Тогда
			Прервать;
		КонецЕсли;
		
	КонецЦикла;
		
КонецПроцедуры

Функция ЗадачаПоИдентификатору(ИдентификаторЗадачи) Экспорт

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Задачи.ДатаСоздания КАК ДатаСоздания,
		|	Задачи.Сценарий КАК Сценарий,
		|	Задачи.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
		|	Задачи.НомерЗадачи КАК НомерЗадачи,
		|	Задачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи,
		|	Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена,
		|	Задачи.Действие КАК Действие,
		|	Задачи.ЗавершенаУспешно КАК ЗавершенаУспешно,
		|	Задачи.ЗавершенаСОшибкой КАК ЗавершенаСОшибкой,
		|	Задачи.Ошибка КАК Ошибка,
		|	Задачи.Параметры КАК Параметры
		|ИЗ
		|	РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи
		|ГДЕ
		|	Задачи.ИдентификаторЗадачи = &ИдентификаторЗадачи";
	
	Запрос.УстановитьПараметр("ИдентификаторЗадачи", ИдентификаторЗадачи);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Следующий() Тогда
		Результат = СтруктураЗадачи();
		ЗаполнитьЗначенияСвойств(Результат, Выборка);
		Возврат Результат;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции

Функция СледующаяЗадача(ИдентификаторЗадачи) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ЗадачаСлед.ДатаСоздания КАК ДатаСоздания,
		|	ЗадачаСлед.Сценарий КАК Сценарий,
		|	ЗадачаСлед.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
		|	ЗадачаСлед.НомерЗадачи КАК НомерЗадачи,
		|	ЗадачаСлед.ИдентификаторЗадачи КАК ИдентификаторЗадачи,
		|	ЗадачаСлед.ИдентификаторОбмена КАК ИдентификаторОбмена,
		|	ЗадачаСлед.Действие КАК Действие,
		|	ЗадачаСлед.ЗавершенаУспешно КАК ЗавершенаУспешно,
		|	ЗадачаСлед.ЗавершенаСОшибкой КАК ЗавершенаСОшибкой,
		|	ЗадачаСлед.Ошибка КАК Ошибка,
		|	ЗадачаСлед.Параметры КАК Параметры
		|ИЗ
		|	РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задача
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК ЗадачаСлед
		|		ПО Задача.ИдентификаторОбмена = ЗадачаСлед.ИдентификаторОбмена
		|			И (Задача.НомерЗадачи + 1 = ЗадачаСлед.НомерЗадачи)
		|ГДЕ
		|	Задача.ИдентификаторЗадачи = &ИдентификаторЗадачи";
	
	Запрос.УстановитьПараметр("ИдентификаторЗадачи", ИдентификаторЗадачи);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Следующий() Тогда
		Результат = СтруктураЗадачи();
		ЗаполнитьЗначенияСвойств(Результат, Выборка);
		Возврат Результат;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции

Функция ПоУзлуЗапланированОбмен(Узел, Сценарий = "", ИдентификаторОбмена = "") Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Задачи.Сценарий КАК Сценарий,
		|	Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена
		|ИЗ
		|	РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи
		|ГДЕ
		|	Задачи.УзелИнформационнойБазы = &Узел
		|	И НЕ Задачи.ЗавершенаУспешно
		|	И НЕ Задачи.ЗавершенаСОшибкой
		|
		|УПОРЯДОЧИТЬ ПО
		|	Задачи.ДатаСоздания УБЫВ,
		|	Задачи.НомерЗадачи";
	
	Запрос.УстановитьПараметр("Узел", Узел);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Следующий() Тогда
		
		Сценарий = Выборка.Сценарий;
		ИдентификаторОбмена = Выборка.ИдентификаторОбмена;
		
		Возврат Не ОчередьЗадачВыполнена(, Выборка.ИдентификаторОбмена);
		
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции

Процедура ОтменитьОчередьЗадач(Узел, Сценарий, ИдентификаторОбмена) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	Задачи.ДатаСоздания КАК ДатаСоздания,
		|	Задачи.Сценарий КАК Сценарий,
		|	Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена
		|ПОМЕСТИТЬ втПоследнийСценарий
		|ИЗ
		|	РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи
		|ГДЕ
		|	Задачи.ИдентификаторОбмена = &ИдентификаторОбмена
		|
		|УПОРЯДОЧИТЬ ПО
		|	ДатаСоздания УБЫВ
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	Задачи.ДатаСоздания КАК ДатаСоздания,
		|	Задачи.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
		|	Задачи.НомерЗадачи КАК НомерЗадачи,
		|	Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена,
		|	Задачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи
		|ИЗ
		|	втПоследнийСценарий КАК втПоследнийСценарий
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи
		|		ПО втПоследнийСценарий.ДатаСоздания = Задачи.ДатаСоздания
		|			И втПоследнийСценарий.ИдентификаторОбмена = Задачи.ИдентификаторОбмена
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	Задачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи,
		|	Задачи.Действие КАК Действие,
		|	Задачи.ЗавершенаУспешно КАК ЗавершенаУспешно,
		|	Задачи.ЗавершенаСОшибкой КАК ЗавершенаСОшибкой
		|ИЗ
		|	втПоследнийСценарий КАК втПоследнийСценарий
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи
		|		ПО втПоследнийСценарий.ДатаСоздания = Задачи.ДатаСоздания
		|			И втПоследнийСценарий.ИдентификаторОбмена = Задачи.ИдентификаторОбмена";
	
	Запрос.УстановитьПараметр("ИдентификаторОбмена", ИдентификаторОбмена);
	
	Результат = Запрос.ВыполнитьПакет();
		
	Выборка = Результат[1].Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		Запись = РегистрыСведений.ЗадачиОбменаДаннымиВнутренняяПубликация.СоздатьМенеджерЗаписи();
		ЗаполнитьЗначенияСвойств(Запись, Выборка);
		Запись.Прочитать();
		Запись.Удалить();
		
	КонецЦикла;
	
	ЗадачиИсточника = Новый Массив;
	
	Если ТипЗнч(Сценарий) = Тип("СправочникСсылка.СценарииОбменовДанными") Тогда
		ЗадачиИсточника.Добавить(Сценарий.РегламентноеЗаданиеGUID);
	КонецЕсли;
	
	ЗадачиПриемника = Новый Массив;
	
	Выборка = Результат[2].Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		Если (Выборка.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанныхКорреспондент
			Или Выборка.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанныхКорреспондент)
			И Не Выборка.ЗавершенаУспешно Тогда
			
			ЗадачиПриемника.Добавить(Выборка.ИдентификаторЗадачи);
			
		ИначеЕсли Выборка.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанных
			Или Выборка.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанных
			Или Выборка.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ДополнительнаяРегистрация Тогда
			
			ЗадачиИсточника.Добавить(Выборка.ИдентификаторЗадачи);
			
		КонецЕсли;
		
		Если Не Выборка.ЗавершенаУспешно Тогда
			Прервать;
		КонецЕсли;
		
	КонецЦикла;
	
	УстановитьПривилегированныйРежим(Истина);
	
	МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий");
	
	Для Каждого ИдентификаторЗадачи Из ЗадачиИсточника Цикл
		
		Отбор = Новый Структура("Ключ", ИдентификаторЗадачи); 
		Задания = МодульОчередьЗаданий.ПолучитьЗадания(Отбор);
		
		Если Задания.Количество() = 0 Тогда
			Продолжить;
		КонецЕсли;
			
		УникальныйИдентификаторФЗ = Задания[0].Идентификатор.ИсполняющееФоновоеЗадание;
			
		Если Не ЗначениеЗаполнено(УникальныйИдентификаторФЗ) Тогда
			Продолжить;
		КонецЕсли;
		
		ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(УникальныйИдентификаторФЗ);
		Если ФоновоеЗадание <> Неопределено Тогда
			ФоновоеЗадание.Отменить();
		КонецЕсли;
		
	КонецЦикла;
	
	Если ЗадачиПриемника.Количество() > 0 Тогда
		
		Прокси = Неопределено;
		ПараметрыПрокси = Новый Структура;
		СтруктураНастроекОбмена = Неопределено;
		Отказ = Ложь;
		Ошибка = "";

		СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы(Узел, "ОтменаОперацииПользователем", Отказ);
		ИнициализацияПрокси(Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка);
		
		Прокси.StopTasks(СериализаторXDTO.ЗаписатьXDTO(ЗадачиПриемника),
			СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента);
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ОтметитьВыполнениеЗадачи(Задача, Ошибка) Экспорт
	
	Если ТипЗнч(Задача) = Тип("Строка") Тогда
		ТекЗадача = ЗадачаПоИдентификатору(Задача);
	Иначе
		ТекЗадача = Задача;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ТекЗадача) Тогда
		
		Запись = РегистрыСведений.ЗадачиОбменаДаннымиВнутренняяПубликация.СоздатьМенеджерЗаписи();
		ЗаполнитьЗначенияСвойств(Запись, ТекЗадача);
		Запись.Прочитать();
			
		Если Ошибка = "" Тогда
			Запись.ЗавершенаУспешно = Истина;	
		Иначе
			Запись.ЗавершенаСОшибкой = Истина;
			Запись.Ошибка = Ошибка;	
		КонецЕсли;
		
		Запись.Записать();
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ПриОжиданииВыгрузкиДанных(ПараметрыОбмена, ПродолжитьОжидание) Экспорт
	
	Ошибка = "";
	ПродолжитьОжидание = Не ОчередьЗадачВыполнена(,ПараметрыОбмена.ИдентификаторОбмена, Ошибка);

	Если Ошибка <> "" Тогда
		ПараметрыОбмена.Отказ = Истина;
		ПараметрыОбмена.СообщениеОбОшибке = Ошибка;
	КонецЕсли;	
		
КонецПроцедуры

Процедура ФормаУзлаПриСозданииНаСервере(Форма, Отказ) Экспорт
	
	МодульНастройкиТранспортаОбменаДанными = РегистрыСведений["НастройкиТранспортаОбменаДанными"];
	НастройкиТранспорта = МодульНастройкиТранспортаОбменаДанными.НастройкиТранспорта(Форма.Объект.Ссылка);
	
	Если НастройкиТранспорта <> Неопределено Тогда
		УстановитьФункциональныеОпцииДляУзла(Форма, НастройкиТранспорта);
		НастроитьЭлементыФормыПоПереходуНаВебСервис(Форма, НастройкиТранспорта);
	КонецЕсли;
	
КонецПроцедуры

#Область ЗадачиПриемника

Процедура ВыполнитьВыгрузкуДляУзлаИнформационнойБазыВСервисПередачиФайлов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	ИмяФайлаСообщения = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(
		ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов(),
		ОбменДаннымиСервер.УникальноеИмяФайлаСообщенияОбмена());
	
	ПараметрыОбменаДанными = ОбменДаннымиСервер.ПараметрыОбменаДаннымиЧерезФайлИлиСтроку();
	
	ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ИмяФайлаСообщения;
	ПараметрыОбменаДанными.ДействиеПриОбмене             = Перечисления.ДействияПриОбмене.ВыгрузкаДанных;
	ПараметрыОбменаДанными.ИмяПланаОбмена                = ИмяПланаОбмена;
	ПараметрыОбменаДанными.КодУзлаИнформационнойБазы     = КодУзлаИнформационнойБазы;
	
	ПредставлениеОшибки = "";
	Попытка
		
		ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными);
		
		ИмяФайлаДляПомещенияВХранилище = ИмяФайлаСообщения;

		ИмяФайлаДляПомещенияВХранилище = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(
			ОбменДаннымиСервер.КаталогВременногоХранилищаФайлов(),
			ОбменДаннымиСервер.УникальноеИмяФайлаСообщенияОбмена("zip"));
		
		Архиватор = Новый ЗаписьZipФайла(ИмяФайлаДляПомещенияВХранилище, , , , УровеньСжатияZIP.Максимальный);
		Архиватор.Добавить(ИмяФайлаСообщения);
		Архиватор.Записать();
		
	Исключение
				
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ОтветныйВызов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи, ПредставлениеОшибки);
		
		УдалитьФайлы(ИмяФайлаСообщения);
		ВызватьИсключение ПредставлениеОшибки;
		
	КонецПопытки;
	
	УдалитьФайлы(ИмяФайлаСообщения);
	
	ОбменДаннымиСервер.ПоместитьФайлВХранилище(ИмяФайлаДляПомещенияВХранилище, ИдентификаторЗадачи);
		
	ОтветныйВызов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи);
		
КонецПроцедуры

Процедура ВыполнитьЗагрузкуДляУзлаИнформационнойБазыИзСервисаПередачиФайлов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи, ИдентификаторФайла) Экспорт
		
	УстановитьПривилегированныйРежим(Истина);
	
	ИмяФайлаСообщения = ОбменДаннымиСервер.ПолучитьФайлИзХранилища(ИдентификаторФайла);
	
	ПараметрыОбменаДанными = ОбменДаннымиСервер.ПараметрыОбменаДаннымиЧерезФайлИлиСтроку();
	
	ПараметрыОбменаДанными.ПолноеИмяФайлаСообщенияОбмена = ИмяФайлаСообщения;
	ПараметрыОбменаДанными.ДействиеПриОбмене             = Перечисления.ДействияПриОбмене.ЗагрузкаДанных;
	ПараметрыОбменаДанными.ИмяПланаОбмена                = ИмяПланаОбмена;
	ПараметрыОбменаДанными.КодУзлаИнформационнойБазы     = КодУзлаИнформационнойБазы;
	
	ПредставлениеОшибки = "";
	Попытка
				
		ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазыЧерезФайлИлиСтроку(ПараметрыОбменаДанными);
		
	Исключение
		
		ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ОтветныйВызов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи, ПредставлениеОшибки);
		
		УдалитьФайлы(ИмяФайлаСообщения);
		ВызватьИсключение ПредставлениеОшибки;
		
	КонецПопытки;
	
	УдалитьФайлы(ИмяФайлаСообщения);
	
	ОтветныйВызов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи);
	
КонецПроцедуры

#КонецОбласти

#Область ДоступностьExchangeAdministrationManage_3_0_1_1

Функция ВСервисеДоступенExchangeAdministrationManage_3_0_1_1() Экспорт
	
	Если Не ОбщегоНазначения.РазделениеВключено() Тогда
		Возврат Ложь;
	КонецЕсли;
	
	МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
	
	ПараметрыПодключения = Новый Структура;
	УстановитьПривилегированныйРежим(Истина);
	ПараметрыПодключения.Вставить("URL", МодульРаботаВМоделиСервиса.ВнутреннийАдресМенеджераСервиса());
	ПараметрыПодключения.Вставить("UserName", МодульРаботаВМоделиСервиса.ИмяСлужебногоПользователяМенеджераСервиса());
	ПараметрыПодключения.Вставить("Password", МодульРаботаВМоделиСервиса.ПарольСлужебногоПользователяМенеджераСервиса());
	УстановитьПривилегированныйРежим(Ложь);
	
	Версии = ОбщегоНазначения.ПолучитьВерсииИнтерфейса(ПараметрыПодключения, "ExchangeAdministrationManage");
	
	Возврат Версии.Найти("3.0.1.1") <> Неопределено;
	
КонецФункции

#КонецОбласти

Функция НастройкиОбменаДляУзлаИнформационнойБазы(Узел, Действие, Отказ) Экспорт
	
	Если Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанных
		Или Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанныхКорреспондент Тогда		
		
		ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ЗагрузкаДанных;		
		
	ИначеЕсли Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанных 
		Или Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанныхКорреспондент Тогда		
		
		ДействиеПриОбмене = Перечисления.ДействияПриОбмене.ВыгрузкаДанных;
		
	Иначе
		
		ДействиеПриОбмене = Действие;
		
	КонецЕсли;
	
	СтруктураНастроекОбмена = ОбменДаннымиСервер.НастройкиОбменаДляУзлаИнформационнойБазы(
		Узел, ДействиеПриОбмене, Перечисления.ВидыТранспортаСообщенийОбмена.WS, Ложь);
	
	Если СтруктураНастроекОбмена.Отказ Тогда
		// Если настройка содержит ошибки, то обмен не производим; статус "Отменено".
		ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена);
		Отказ = Истина;
		Возврат Неопределено;
	КонецЕсли;
	
	СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено;
	
	Возврат СтруктураНастроекОбмена;
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область Задачи

Процедура УдалитьУстаревшиеЗадачи(Сценарий = Неопределено, РучнойОбмен = Ложь)
	
	// Оставляем N последних записей
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 5
		|	Задачи.ДатаСоздания КАК ДатаСоздания
		|ПОМЕСТИТЬ втДаты
		|ИЗ
		|	РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи
		|ГДЕ
		|	(&РучнойОбмен
		|				И ТИПЗНАЧЕНИЯ(Задачи.Сценарий) = ТИП(СТРОКА)
		|			ИЛИ НЕ &РучнойОбмен
		|				И Задачи.Сценарий = &Сценарий)
		|
		|УПОРЯДОЧИТЬ ПО
		|	ДатаСоздания УБЫВ
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	Задачи.ДатаСоздания КАК ДатаСоздания,
		|	Задачи.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
		|	Задачи.НомерЗадачи КАК НомерЗадачи,
		|	Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена,
		|	Задачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи
		|ИЗ
		|	РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи
		|ГДЕ
		|	Задачи.Сценарий = &Сценарий
		|	И НЕ Задачи.ДатаСоздания В
		|				(ВЫБРАТЬ
		|					втДаты.ДатаСоздания
		|				ИЗ
		|					втДаты)";
	
	Запрос.УстановитьПараметр("Сценарий", Сценарий);
	Запрос.УстановитьПараметр("РучнойОбмен", РучнойОбмен);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		Запись = РегистрыСведений.ЗадачиОбменаДаннымиВнутренняяПубликация.СоздатьМенеджерЗаписи();
		ЗаполнитьЗначенияСвойств(Запись, Выборка);
		Запись.Прочитать();
		
		Если Запись.Выбран() Тогда
			Запись.Удалить();
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Функция ОтключитьСценарийПриНеобходимости(Сценарий)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 3
		|	Задачи.ДатаСоздания КАК ДатаСоздания,
		|	Задачи.Сценарий КАК Сценарий,
		|	Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена,
		|	Задачи.УзелИнформационнойБазы КАК УзелИнформационнойБазы
		|ПОМЕСТИТЬ втДаты
		|ИЗ
		|	РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи
		|ГДЕ
		|	Задачи.Сценарий = &Сценарий
		|
		|УПОРЯДОЧИТЬ ПО
		|	ДатаСоздания УБЫВ
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	Задачи.ДатаСоздания КАК ДатаСоздания,
		|	Задачи.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
		|	Задачи.Ошибка КАК Ошибка
		|ИЗ
		|	втДаты КАК втДаты
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи
		|		ПО втДаты.ДатаСоздания = Задачи.ДатаСоздания
		|			И втДаты.ИдентификаторОбмена = Задачи.ИдентификаторОбмена
		|			И (Задачи.ЗавершенаСОшибкой)";
	
	Запрос.УстановитьПараметр("Сценарий", Сценарий);
	
	Результат = Запрос.Выполнить().Выгрузить();
	
	Если Результат.Количество() >= 3 Тогда
			
		СценарийОбъект = Сценарий.ПолучитьОбъект();
		СценарийОбъект.ИспользоватьРегламентноеЗадание = Ложь;
		СценарийОбъект.ОтключенАвтоматически = Истина;
		
		НачатьТранзакцию();
		
		Попытка
			
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить("Справочник.СценарииОбменовДанными");
			ЭлементБлокировки.УстановитьЗначение("Ссылка", Сценарий);
			ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
			Блокировка.Заблокировать();
			
			СценарийОбъект.Записать();
			
			ЗафиксироватьТранзакцию();
			
		Исключение
			
			ОтменитьТранзакцию();
			
			СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
			ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОтключениеСценария(),
				УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке);
			
		КонецПопытки;
				
		Возврат Истина;
			
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции

Процедура УдалитьЗадачиПоСценариюСОшибкой(Сценарий) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Задачи.ИдентификаторОбмена КАК ИдентификаторОбмена
		|ПОМЕСТИТЬ ВТ_Задачи
		|ИЗ
		|	РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи
		|ГДЕ
		|	Задачи.Сценарий = &Сценарий
		|	И Задачи.ЗавершенаСОшибкой
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ЗадачиОбменаДаннымиВнутренняяПубликация.ДатаСоздания КАК ДатаСоздания,
		|	ЗадачиОбменаДаннымиВнутренняяПубликация.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
		|	ЗадачиОбменаДаннымиВнутренняяПубликация.НомерЗадачи КАК НомерЗадачи,
		|	ЗадачиОбменаДаннымиВнутренняяПубликация.ИдентификаторОбмена КАК ИдентификаторОбмена,
		|	ЗадачиОбменаДаннымиВнутренняяПубликация.ИдентификаторЗадачи КАК ИдентификаторЗадачи
		|ИЗ
		|	ВТ_Задачи КАК ВТ_Задачи
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК ЗадачиОбменаДаннымиВнутренняяПубликация
		|		ПО ВТ_Задачи.ИдентификаторОбмена = ЗадачиОбменаДаннымиВнутренняяПубликация.ИдентификаторОбмена";
	
	Запрос.УстановитьПараметр("Сценарий", Сценарий);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	НачатьТранзакцию();	
	
	Попытка
			
		Блокировка = Новый БлокировкаДанных;
		ЭлементБлокировки = Блокировка.Добавить("Справочник.СценарииОбменовДанными");
		ЭлементБлокировки.УстановитьЗначение("Ссылка", Сценарий);
		ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
		Блокировка.Заблокировать();
		
		Пока Выборка.Следующий() Цикл
			
			Запись = РегистрыСведений.ЗадачиОбменаДаннымиВнутренняяПубликация.СоздатьМенеджерЗаписи();
			ЗаполнитьЗначенияСвойств(Запись, Выборка);
			Запись.Прочитать();
			Запись.Удалить();
			
		КонецЦикла;
		
		ЗафиксироватьТранзакцию();
		
	Исключение
		
		ОтменитьТранзакцию();
		
		СообщениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		
		ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОтключениеСценария(),
			УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке);
			
	КонецПопытки;
	
КонецПроцедуры	

Функция ОчередьЗадачВыполнена(Сценарий = "", ИдентификаторОбмена = "", Ошибка = "")
	
	// Считаем, что сценарий (или ручной обмен) завершен, если для всех задач ЗавершеноУспешно = Истина, или есть ошибка 
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Задачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи,
		|	Задачи.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
		|	Задачи.НомерЗадачи КАК НомерЗадачи,
		|	Задачи.Действие КАК Действие,
		|	Задачи.ЗавершенаУспешно КАК ЗавершенаУспешно,
		|	Задачи.ЗавершенаСОшибкой КАК ЗавершенаСОшибкой,
		|	Задачи.Ошибка КАК Ошибка
		|ПОМЕСТИТЬ втЗадачи
		|ИЗ
		|	РегистрСведений.ЗадачиОбменаДаннымиВнутренняяПубликация КАК Задачи
		|ГДЕ
		|	(Задачи.Сценарий = &Сценарий
		|			ИЛИ Задачи.ИдентификаторОбмена = &ИдентификаторОбмена)
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	втЗадачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи,
		|	втЗадачи.Действие КАК Действие,
		|	втЗадачи.Ошибка КАК Ошибка
		|ИЗ
		|	втЗадачи КАК втЗадачи
		|ГДЕ
		|	втЗадачи.ЗавершенаСОшибкой
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ИСТИНА КАК Выполнено
		|ИЗ
		|	втЗадачи КАК втЗадачи
		|
		|ИМЕЮЩИЕ
		|	СУММА(ВЫБОР
		|			КОГДА втЗадачи.ЗавершенаУспешно
		|				ТОГДА 1
		|			ИНАЧЕ 0
		|		КОНЕЦ) = МАКСИМУМ(втЗадачи.НомерЗадачи)
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ ПЕРВЫЕ 1
		|	втЗадачи.ИдентификаторЗадачи КАК ИдентификаторЗадачи,
		|	втЗадачи.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
		|	втЗадачи.Действие КАК Действие,
		|	втЗадачи.НомерЗадачи КАК НомерЗадачи
		|ИЗ
		|	втЗадачи КАК втЗадачи
		|ГДЕ
		|	НЕ втЗадачи.ЗавершенаУспешно
		|	И НЕ втЗадачи.ЗавершенаСОшибкой
		|
		|УПОРЯДОЧИТЬ ПО
		|	НомерЗадачи";
	
	Запрос.УстановитьПараметр("Сценарий", Сценарий);
	Запрос.УстановитьПараметр("ИдентификаторОбмена", ИдентификаторОбмена);
	
	Результат = Запрос.ВыполнитьПакет();
	
	// Завершено с ошибкой
	Выборка = Результат[1].Выбрать();
	Если Выборка.Следующий() Тогда
		Ошибка = Выборка.Ошибка;
		Возврат Истина;
	КонецЕсли;
	
	// Все задачи завершены успешно
	Выборка = Результат[2].Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Истина;
	КонецЕсли;
	
	// Текущая задача
	Выборка = Результат[3].Выбрать();
	
	Если Выборка.Следующий() Тогда
		Возврат Ложь
	КонецЕсли;
		
	Возврат Истина;

КонецФункции

Функция СтруктураЗадачи()
	
	Задача = Новый Структура;
	Задача.Вставить("ДатаСоздания");
	Задача.Вставить("Сценарий");
	Задача.Вставить("УзелИнформационнойБазы");
	Задача.Вставить("НомерЗадачи");
	Задача.Вставить("ИдентификаторОбмена");
	Задача.Вставить("ИдентификаторЗадачи");
	Задача.Вставить("Действие");
	Задача.Вставить("ЗавершенаУспешно");
	Задача.Вставить("ЗавершенаСОшибкой");
	Задача.Вставить("Параметры");
	
	Возврат Задача;
	
КонецФункции

Процедура ЗаполнитьЗадачиПоСценарию(Сценарий, ПерваяЗадача = Неопределено) 
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	НастройкиОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
		|	НастройкиОбмена.ВыполняемоеДействие КАК ВыполняемоеДействие
		|ИЗ
		|	Справочник.СценарииОбменовДанными.НастройкиОбмена КАК НастройкиОбмена
		|ГДЕ
		|	НастройкиОбмена.Ссылка = &Ссылка
		|
		|УПОРЯДОЧИТЬ ПО
		|	НастройкиОбмена.НомерСтроки";
	
	Запрос.УстановитьПараметр("Ссылка", Сценарий);
	
	Выборка = Запрос.Выполнить().Выбрать(); // АПК:1328 - блокировка не требуется.
	
	НомерЗадачи = 1;
	
	Запись = СтруктураЗадачи();
	Запись.ДатаСоздания = ТекущаяУниверсальнаяДата();
	Запись.Сценарий = Сценарий;
	Запись.ЗавершенаУспешно = Ложь;
	Запись.ЗавершенаСОшибкой = Ложь;
	Запись.ИдентификаторОбмена = Строка(Новый УникальныйИдентификатор);
	
	Набор = РегистрыСведений.ЗадачиОбменаДаннымиВнутренняяПубликация.СоздатьНаборЗаписей();
		
	Пока Выборка.Следующий() Цикл
		
		Запись.Вставить("УзелИнформационнойБазы", Выборка.УзелИнформационнойБазы);
		
		Если Выборка.ВыполняемоеДействие = Перечисления.ДействияПриОбмене.ЗагрузкаДанных Тогда
			
			//
			Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанныхКорреспондент;
			Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор);
			Запись.НомерЗадачи = НомерЗадачи;
						
			НоваяЗапись = Набор.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись);
			
			Если ПерваяЗадача = Неопределено Тогда
				ПерваяЗадача = ОбщегоНазначения.СкопироватьРекурсивно(Запись, Ложь);
			КонецЕсли;
			
			НомерЗадачи = НомерЗадачи + 1;
			
			//
			Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанных;
			Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор);
			Запись.НомерЗадачи = НомерЗадачи;
			
			НоваяЗапись = Набор.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись);
			
			НомерЗадачи = НомерЗадачи + 1;
			
		Иначе
			
			//
			Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанных;
			Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор);
			Запись.НомерЗадачи = НомерЗадачи;
			
			НоваяЗапись = Набор.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись);
			
			Если ПерваяЗадача = Неопределено Тогда
				ПерваяЗадача = ОбщегоНазначения.СкопироватьРекурсивно(Запись, Ложь);
			КонецЕсли;
			
			НомерЗадачи = НомерЗадачи + 1;
			
			//
			Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанныхКорреспондент;
			Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор);
			Запись.НомерЗадачи = НомерЗадачи;
			
			НоваяЗапись = Набор.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись);
			
			НомерЗадачи = НомерЗадачи + 1;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Набор.Записать(Ложь);
	
КонецПроцедуры

Процедура ЗаполнитьЗадачиДляОбменаВручную(УзелИнформационнойБазы, ИдентификаторОбмена, ПерваяЗадача, ДополнениеВыгрузки)
	
	Запись = СтруктураЗадачи();
	Запись.ДатаСоздания = ТекущаяУниверсальнаяДата();
	Запись.УзелИнформационнойБазы = УзелИнформационнойБазы;
	Запись.ЗавершенаУспешно = Ложь;
	Запись.ЗавершенаСОшибкой = Ложь;
	Запись.ИдентификаторОбмена = ИдентификаторОбмена;
		
	Набор = РегистрыСведений.ЗадачиОбменаДаннымиВнутренняяПубликация.СоздатьНаборЗаписей();
	
	НомерЗадачи = 1;
			
	// Получение данных (UploadDataInt)
	Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанныхКорреспондент;
	Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор);
	Запись.НомерЗадачи = НомерЗадачи;
	НоваяЗапись = Набор.Добавить();
	ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись);
	
	НомерЗадачи = НомерЗадачи + 1;
			
	ПерваяЗадача = ОбщегоНазначения.СкопироватьРекурсивно(Запись, Ложь);
	
	// Получение данных (Загрузка)
	Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанных;
	Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор);
	Запись.НомерЗадачи = НомерЗадачи;
	НоваяЗапись = Набор.Добавить();
	ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись);
	
	НомерЗадачи = НомерЗадачи + 1;
	
	// Дополнительная регистрация
	Если ДополнениеВыгрузки <> Неопределено Тогда

		Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ДополнительнаяРегистрация;
		Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор);
		Запись.НомерЗадачи = НомерЗадачи;
		НоваяЗапись = Набор.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись);
		НоваяЗапись.Параметры = Новый ХранилищеЗначения(ДополнениеВыгрузки);
		
		НомерЗадачи = НомерЗадачи + 1;
	
	КонецЕсли;
		
	// Отправка данных (Выгрузка)
	Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанных;
	Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор);
	Запись.НомерЗадачи = НомерЗадачи;
	НоваяЗапись = Набор.Добавить();
	ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись);
	
	НомерЗадачи = НомерЗадачи + 1;
		
	// Отправка данных (DownloadDataInt)
	Запись.Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанныхКорреспондент;
	Запись.ИдентификаторЗадачи = Строка(Новый УникальныйИдентификатор);
	Запись.НомерЗадачи = НомерЗадачи;	
	НоваяЗапись = Набор.Добавить();
	ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись);	
			
	Набор.Записать(Ложь);
	
КонецПроцедуры

Процедура ОтветныйВызов(ИмяПланаОбмена, КодУзлаИнформационнойБазы, ИдентификаторЗадачи, Ошибка = "")
	
	Узел = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодУзлаИнформационнойБазы);
	НастройкиТранспорта = РегистрыСведений.НастройкиТранспортаОбменаДанными.НастройкиТранспортаWS(Узел);
	СтрокаСообщенияОбОшибке = "";
	
	Прокси = ОбменДаннымиВебСервис.WSПроксиДляУзлаИнформационнойБазы(Узел, СтрокаСообщенияОбОшибке);
	
	Прокси.Callback(ИдентификаторЗадачи, Ошибка, НастройкиТранспорта.WSОбластьДанныхКорреспондента);

КонецПроцедуры

Процедура ВыполнитьЗадачу(Задача, ПараметрыОбмена, Отказ) Экспорт
	
	// Синхронизация может быть прервана пользователем
	Если Задача.ЗавершенаСОшибкой Тогда
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	
	Прокси = Неопределено;
	ПараметрыПрокси = Новый Структура;
	СтруктураНастроекОбмена = Неопределено;
	
	Ошибка = "";
	Узел = Задача.УзелИнформационнойБазы;
	Действие = Задача.Действие;

	Если Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанныхКорреспондент Тогда
		
		СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы(Узел, Действие, Отказ);
		ИнициализацияПрокси(Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка);
		ВыполнитьЗадачуВыгрузкаДанныхКорреспондент(Задача, Прокси, СтруктураНастроекОбмена, Отказ, Ошибка);
		
	ИначеЕсли Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанных Тогда
		
		СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы(Узел, Действие, Отказ);
		ВыполнитьЗадачуЗагрузкаДанных(Задача, ПараметрыОбмена, СтруктураНастроекОбмена, Отказ, Ошибка);
		ОтметитьВыполнениеЗадачи(Задача, Ошибка);
		ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена);
						
	ИначеЕсли Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ВыгрузкаДанных Тогда
		
		СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы(Узел, Действие, Отказ);
		ИнициализацияПрокси(Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка);
		ВыполнитьЗадачуВыгрузкаДанных(Задача, Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка);
		ОтметитьВыполнениеЗадачи(Задача, Ошибка);
		ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена);
								
	ИначеЕсли Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ЗагрузкаДанныхКорреспондент Тогда
		
		СтруктураНастроекОбмена = НастройкиОбменаДляУзлаИнформационнойБазы(Узел, Действие, Отказ);
		ИнициализацияПрокси(Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка);
		ВыполнитьЗадачуЗагрузкаДанныхКорреспондент(Задача, Прокси, ПараметрыОбмена, СтруктураНастроекОбмена, Отказ, Ошибка)
		
	ИначеЕсли Действие = Перечисления.ДействияПриОбменеВнутренняяПубликация.ДополнительнаяРегистрация Тогда
		
		ВыполнитьЗадачуДополнительнаяРегистрация(Задача, Отказ, Ошибка);	
		ОтметитьВыполнениеЗадачи(Задача, Ошибка);
		
	КонецЕсли;
				
КонецПроцедуры

Процедура ВыполнитьЗадачуВыгрузкаДанныхКорреспондент(Задача, Прокси, СтруктураНастроекОбмена, Отказ, Ошибка)
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	Попытка
			
		Прокси.UploadDataInt(СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод,
			Задача.ИдентификаторЗадачи, СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента);
								
	Исключение
		
		Ошибка = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		Отказ = Истина;
		ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Ошибка, СтруктураНастроекОбмена, Истина);
		СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка;
			
	КонецПопытки;

КонецПроцедуры

Процедура ВыполнитьЗадачуЗагрузкаДанных(Задача, ПараметрыОбмена, СтруктураНастроекОбмена, Отказ, Ошибка)
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;

	Попытка
		
		УИДФайлаСообщения = Новый УникальныйИдентификатор(ПараметрыОбмена.ИдентификаторЗадачиПред);
		ФайлСообщенияОбмена = ОбменДаннымиВебСервис.ПолучитьФайлИзХранилищаВСервисе(УИДФайлаСообщения,
			СтруктураНастроекОбмена.УзелИнформационнойБазы, 1024, ПараметрыОбмена.ПараметрыАутентификации);

		ОбменДаннымиСервер.ПрочитатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ФайлСообщенияОбмена);
		
	Исключение
		
		Отказ = Истина;
		Ошибка = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Ошибка, СтруктураНастроекОбмена, Истина);
		СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка;

	КонецПопытки;
	
	Если РезультатВыполненияОбменаВыполненоСОшибкой(СтруктураНастроекОбмена, Отказ, Ошибка) Тогда
		Возврат;
	КонецЕсли;
	
	СообщениеПрочитано = ОбменДаннымиСервер.РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена);
	
	Если СообщениеПрочитано И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
		РегистрыСведений.ОбработчикиСобытийСинхронизацииДанных.ВыполнитьОбработчики(СтруктураНастроекОбмена.УзелИнформационнойБазы, "ПослеПолученияДанных");
	КонецЕсли;
	
	Попытка
		Если Не ПустаяСтрока(ФайлСообщенияОбмена) Тогда
			УдалитьФайлы(ФайлСообщенияОбмена);
		КонецЕсли;
	Исключение
		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(),
			УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;

КонецПроцедуры

Процедура ВыполнитьЗадачуВыгрузкаДанных(Задача, Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка)

	Если Отказ Тогда
		Возврат;
	КонецЕсли;

	ВременныйКаталог = ПолучитьИмяВременногоФайла();
	СоздатьКаталог(ВременныйКаталог);
	
	ФайлСообщенияОбмена = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ВременныйКаталог, ОбменДаннымиСервер.УникальноеИмяФайлаСообщенияОбмена());
	
	Попытка
		ОбменДаннымиСервер.ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, ФайлСообщенияОбмена);
	Исключение
		Отказ = Истина;
		Ошибка = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Ошибка, СтруктураНастроекОбмена, Истина);
		СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка;
	КонецПопытки;
	
	Если РезультатВыполненияОбменаВыполненоСОшибкой(СтруктураНастроекОбмена, Отказ, Ошибка) Тогда
		Возврат;
	КонецЕсли;
		
	Если ОбменДаннымиСервер.РезультатВыполненияОбменаВыполнено(СтруктураНастроекОбмена.РезультатВыполненияОбмена) И Не Отказ Тогда
		
		Попытка
			
			ИдентификаторФайла = Задача.ИдентификаторЗадачи;
			
			ОбменДаннымиВебСервис.ПоместитьФайлВХранилищеВСервисе(Прокси, ПараметрыПрокси.ТекущаяВерсия, СтруктураНастроекОбмена, 
				ФайлСообщенияОбмена, СтруктураНастроекОбмена.УзелИнформационнойБазы, 1024, ИдентификаторФайла);
				
			Если РезультатВыполненияОбменаВыполненоСОшибкой(СтруктураНастроекОбмена, Отказ, Ошибка) Тогда
				Возврат;
			КонецЕсли;
	    				
			Попытка
				УдалитьФайлы(ВременныйКаталог);
			Исключение
				ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииОбменДанными(),
					УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
			КонецПопытки;
			
		Исключение
			
			Отказ = Истина;
			Ошибка = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Ошибка, СтруктураНастроекОбмена, Истина);
			СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка;
						
		КонецПопытки;
		
	КонецЕсли;
	
КонецПроцедуры	

Процедура ВыполнитьЗадачуЗагрузкаДанныхКорреспондент(Задача, Прокси, ПараметрыОбмена, СтруктураНастроекОбмена, Отказ, Ошибка)
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;

	Попытка
		
		Прокси.DownloadDataInt(СтруктураНастроекОбмена.ИмяПланаОбмена, СтруктураНастроекОбмена.ТекущийУзелПланаОбменаКод,
			Задача.ИдентификаторЗадачи, ПараметрыОбмена.ИдентификаторЗадачиПред,
			СтруктураНастроекОбмена.НастройкиТранспорта.WSОбластьДанныхКорреспондента);
		
	Исключение
		
		Отказ = Истина;
		Ошибка = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Ошибка, СтруктураНастроекОбмена, Истина);
		СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка;
		
	КонецПопытки;

КонецПроцедуры	

Процедура ВыполнитьЗадачуДополнительнаяРегистрация(Задача, Отказ, Ошибка)
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;

	ДополнениеВыгрузки = Задача.Параметры.Получить();
	
	ДополнениеВыгрузкиОбъект = Обработки.ИнтерактивноеИзменениеВыгрузки.Создать();
	ЗаполнитьЗначенияСвойств(ДополнениеВыгрузкиОбъект, ДополнениеВыгрузки, , "ДополнительнаяРегистрация, ДополнительнаяРегистрацияСценарияУзла");
	
	ДополнениеВыгрузкиОбъект.КомпоновщикОтбораВсехДокументов.ЗагрузитьНастройки(ДополнениеВыгрузки.КомпоновщикОтбораВсехДокументовНастройки);
		
	ОбменДаннымиСервер.ЗаполнитьТаблицуЗначений(ДополнениеВыгрузкиОбъект.ДополнительнаяРегистрация, ДополнениеВыгрузки.ДополнительнаяРегистрация);
	ОбменДаннымиСервер.ЗаполнитьТаблицуЗначений(ДополнениеВыгрузкиОбъект.ДополнительнаяРегистрацияСценарияУзла, ДополнениеВыгрузки.ДополнительнаяРегистрацияСценарияУзла);
	
	Если Не ДополнениеВыгрузки.КомпоновщикВсехДокументов = Неопределено Тогда
		ДополнениеВыгрузкиОбъект.АдресКомпоновщикаВсехДокументов = ПоместитьВоВременноеХранилище(ДополнениеВыгрузки.КомпоновщикВсехДокументов);
	КонецЕсли;
	
	// Сохраняем настройки дополнения выгрузки.
	ОбменДаннымиСервер.ИнтерактивноеИзменениеВыгрузкиСохранитьНастройки(ДополнениеВыгрузкиОбъект, 
		ОбменДаннымиСервер.ДополнениеВыгрузкиИмяАвтоСохраненияНастроек());
	
	// Дополнительно регистрируем данные.
	Попытка
		ОбменДаннымиСервер.ИнтерактивноеИзменениеВыгрузкиЗарегистрироватьДополнительныеДанные(ДополнениеВыгрузкиОбъект);
	Исключение
		
		Отказ = Истина;
		
		Информация = ИнформацияОбОшибке();
		
		Ошибка = НСтр("ru = 'Возникла проблема при добавлении данных к выгрузке:'") 
			+ Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация)
			+ Символы.ПС + НСтр("ru = 'Измените условия отбора.'");
			
		ЗаписьЖурналаРегистрации(ОбменДаннымиСервер.СобытиеЖурналаРегистрацииСозданиеОбменаДанными(),
			УровеньЖурналаРегистрации.Ошибка, , , ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));
			
	КонецПопытки;
	
КонецПроцедуры

#КонецОбласти

#Область НастройкаФормыУзла

Процедура УстановитьФункциональныеОпцииДляУзла(Форма, НастройкиТранспорта)
	
	УстановитьПривилегированныйРежим(Истина);
	
	Узел = Форма.Объект.Ссылка;
	ВидТранспорта = НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию;
	
	ИспользоватьСценарии = 
		ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WS
		И ЗначениеЗаполнено(НастройкиТранспорта.WSКонечнаяТочкаКорреспондента);
		
	ИспользоватьНастройкиПодключения = 
		ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WS	
		Или ВидТранспорта = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим;
		
	ЗаписьНастроек = РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз.СоздатьМенеджерЗаписи();
	ЗаписьНастроек.УзелИнформационнойБазы = Узел;
	ЗаписьНастроек.Прочитать();
	
	Если ЗаписьНастроек.ИспользоватьСценарииВМоделиСервиса <> ИспользоватьСценарии
		Или ЗаписьНастроек.ИспользоватьНастройкиПодключенияВМоделиСервиса <> ИспользоватьНастройкиПодключения Тогда
		
		ЗаписьНастроек.ИспользоватьСценарииВМоделиСервиса = ИспользоватьСценарии;
		ЗаписьНастроек.ИспользоватьНастройкиПодключенияВМоделиСервиса = ИспользоватьНастройкиПодключения;
		
		ЗаписьНастроек.Записать();
		
	КонецЕсли;
		
	Форма.УстановитьПараметрыФункциональныхОпцийФормы(Новый Структура("ОбщиеНастройкиУзлов", Узел))
	
КонецПроцедуры

Процедура НастроитьЭлементыФормыПоПереходуНаВебСервис(Форма, НастройкиТранспорта)
	
	Элементы = Форма.Элементы;
	УзелСсылка = Форма.Объект.Ссылка;
	
	ЭтоОбменЧерезВебСервис = 
		НастройкиТранспорта <> Неопределено
		И (НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию = Перечисления.ВидыТранспортаСообщенийОбмена.WS
		Или НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию = Перечисления.ВидыТранспортаСообщенийОбмена.WSПассивныйРежим);
		
	ДоступенExchangeAdministrationManage_3_0_1_1 = ДляУзлаДоступенExchangeAdministrationManage_3_0_1_1(УзелСсылка) = Истина;
		
	Если Не Пользователи.ЭтоПолноправныйПользователь()
		Или УзелСсылка.Пустая()
		Или	ЭтоОбменЧерезВебСервис
		Или Не ДоступенExchangeAdministrationManage_3_0_1_1
		Или Не ОбменДаннымиПовтИсп.ЭтоПланОбменаXDTO(УзелСсылка)
		Или Не ОбменДаннымиСервер.НастройкаСинхронизацииЗавершена(УзелСсылка) Тогда
		
		ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(
			Форма.Элементы,
			"ФормаОбщаяКомандаПомощникПереходаНаИнтернетВнутренняяПубликация",
			"Видимость",
			Ложь);
			
		Возврат; 
				 
	КонецЕсли;
	
	Элементы = Форма.Элементы;
	
	ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(
		Форма.Элементы,
		"ФормаОбщаяКомандаПомощникПереходаНаИнтернетВнутренняяПубликация",
		"ПоложениеВКоманднойПанели",
		ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю);
		
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Настройки.УзелИнформационнойБазы КАК УзелИнформационнойБазы,
		|	Настройки.ПереходНаWS_Этап КАК ПереходНаWS_Этап
		|ИЗ
		|	РегистрСведений.ОбщиеНастройкиУзловИнформационныхБаз КАК Настройки
		|ГДЕ
		|	Настройки.УзелИнформационнойБазы = &Узел";
	
	Запрос.УстановитьПараметр("Узел", УзелСсылка);
		
	Выборка = Запрос.Выполнить().Выбрать();
								
	НеЗаконченПереходНаВебСервис = Выборка.Следующий() И Выборка.ПереходНаWS_Этап > 0;
	НеПредлагатьПерейтиНаВебСервис = ОбменДаннымиВнутренняяПубликацияВызовСервера.ФлагНастройкиНеПредлагатьПерейтиНаВебСервис(УзелСсылка);
	ТекстПанели = "";
	
	Если НеЗаконченПереходНаВебСервис Тогда
		
		ТекстПанели = 
			НСтр("ru = '<br>Не завершен переход на обмен через Интернет (веб-сервис). 
                  |<br> 
                  |<br>Воспользуйтесь <a href=ФормаПомощникПереходаНаИнтернетВнутренняяПубликация>помощником</a> для завершения перехода.'"); 
			
	ИначеЕсли Не НеПредлагатьПерейтиНаВебСервис Тогда
												
		ТекстПанели = 
			НСтр("ru = 'Для данной синхронизации есть возможность настроить обмен через Интернет (веб-сервис). 
                  |<br>Это позволит ускорить обмен и более гибко настроить график синхронизации. 
                  |<br>Для перехода на обмен по средством веб-сервиса, воспользуйтесь <a href=ФормаПомощникПереходаНаИнтернетВнутренняяПубликация>помощником перехода</a>.
                  |<br><br>
                  |<a href=НеПредлагатьПерейтиНаВебСервис>Больше не предлагать перейти на веб-сервис</a>. (Вызвать помощник перехода можно через меню <b>Еще<b>)'");
									
	КонецЕсли;
	
	Если Не ПустаяСтрока(ТекстПанели) Тогда
		
		ИмяЭлемента = "ИнформацияОПереходеНаВебСервис"; 
		
		Группа = Элементы.Вставить(ИмяЭлемента, Тип("ГруппаФормы"), Форма, Элементы.ФормаКоманднаяПанель);
		Группа.Вид 			= ВидГруппыФормы.ОбычнаяГруппа;
		Группа.Группировка 	= ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
		Группа.ЦветФона 	= WebЦвета.БледноЗеленый;
		Группа.ОтображатьЗаголовок = Ложь;
		
		ДекорацияОтступ = Элементы.Добавить("Отступ" + ИмяЭлемента, Тип("ДекорацияФормы"), Группа);
		ДекорацияОтступ.Вид = ВидДекорацииФормы.Надпись;
		
		ДекорацияКартинка = Элементы.Добавить("Картинка" + ИмяЭлемента, Тип("ДекорацияФормы"), Группа);
		ДекорацияКартинка.Вид 		= ВидДекорацииФормы.Картинка;
		ДекорацияКартинка.Картинка 	= БиблиотекаКартинок.Информация;
		ДекорацияКартинка.Высота 	= 3;
		ДекорацияКартинка.Ширина 	= 5;
		ДекорацияКартинка.РазмерКартинки = РазмерКартинки.Пропорционально;
		
		ФДок = Новый ФорматированныйДокумент;
		ФДок.УстановитьHTML("<html>" + ТекстПанели + "</html>", Новый Структура);
		
		ДекорацияНадпись = Элементы.Добавить("Надпись" + ИмяЭлемента, Тип("ДекорацияФормы"), Группа);
		ДекорацияНадпись.Вид 						= ВидДекорацииФормы.Надпись;
		ДекорацияНадпись.АвтоМаксимальнаяШирина 	= Ложь;
		ДекорацияНадпись.РастягиватьПоГоризонтали 	= Истина;
		ДекорацияНадпись.Заголовок 					= ФДок.ПолучитьФорматированнуюСтроку();
		ДекорацияНадпись.УстановитьДействие("ОбработкаНавигационнойСсылки", "Подключаемый_ОбработкаНавигационнойСсылки");
	
	КонецЕсли;
		
КонецПроцедуры

#КонецОбласти

#Область Прочее

Функция ДляУзлаДоступенExchangeAdministrationManage_3_0_1_1(Узел)
	
	Доступен = РегистрыСведений.НастройкиОбменаДаннымиXDTO.ЗначениеНастройкиКорреспондента(Узел, "ДоступенExchangeAdministrationManage_3_0_1_1");
	
	Возврат Доступен = Истина;
		
КонецФункции

Процедура ИнициализацияПрокси(Прокси, ПараметрыПрокси, СтруктураНастроекОбмена, Отказ, Ошибка)
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	СостояниеНастройки = Неопределено;
	ОбменДаннымиВебСервис.ИнициализироватьWSПроксиДляУправленияОбменомДанными(Прокси, СтруктураНастроекОбмена,
		ПараметрыПрокси, Отказ, СостояниеНастройки, Ошибка);
	
	Если Отказ Тогда
		ОбменДаннымиСервер.ЗаписьЖурналаРегистрацииОбменаДанными(Ошибка, СтруктураНастроекОбмена, Истина);
		СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Отменено;
		ОбменДаннымиСервер.ЗафиксироватьЗавершениеОбмена(СтруктураНастроекОбмена);
	КонецЕсли;

КонецПроцедуры

Функция СобытиеЖурналаРегистрацииОтключениеСценария()
	
	Возврат НСтр("ru = 'Обмен данными.Отключение сценария'", ОбщегоНазначения.КодОсновногоЯзыка());
	
КонецФункции

Функция РезультатВыполненияОбменаВыполненоСОшибкой(СтруктураНастроекОбмена, Отказ, Ошибка)
	
	Если СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка
		Или СтруктураНастроекОбмена.РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка_ТранспортСообщения Тогда
		
		Отказ = Истина;
		
		Если ЗначениеЗаполнено(СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке) Тогда
			Ошибка = СтруктураНастроекОбмена.СтрокаСообщенияОбОшибке;
		КонецЕсли;
		
		Возврат Истина;
		
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции

#КонецОбласти

#КонецОбласти